/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.edu.uniminuto.arqSw.videoMinuto.DAO;

import co.edu.uniminuto.arqSw.videoMinuto.Hibernate.HibernateUtil;
import java.io.Serializable;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;

/**
 *
 * @author Administrador
 */
public class GenericDAO {

    private Session session;

    public GenericDAO() {
        this.session = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    public Session getSession() {
        return session;
    }
    private Session sesion;

    protected void iniciaOperacion() {
        sesion = HibernateUtil.getSessionFactory().openSession();
        sesion.getTransaction().begin();
    }

    protected void terminaOperacion() {
        sesion.getTransaction().commit();
        sesion.close();
    }

    protected void manejaExcepcion(HibernateException he) throws HibernateException {
        sesion.getTransaction().rollback();
        throw he;
    }

    public static void almacenaEntidad(Object entidad) throws HibernateException {
        GenericDAO dummy = new GenericDAO() {
        };

        try {
            dummy.iniciaOperacion();
            dummy.getSession().saveOrUpdate(entidad);
            dummy.getSession().flush();
        } catch (HibernateException he) {
            dummy.manejaExcepcion(he);
        } finally {
            dummy.terminaOperacion();
        }
    }

    public static <T> T getEntidad(Serializable id, Class<T> claseEntidad) throws HibernateException {
        GenericDAO dummy = new GenericDAO() {
        };

        T objetoRecuperado = null;

        try {
            dummy.iniciaOperacion();
            objetoRecuperado = (T) dummy.getSession().get(claseEntidad, id);
        } catch (HibernateException he) {
            dummy.manejaExcepcion(he);
        } finally {
            dummy.terminaOperacion();
        }

        return objetoRecuperado;
    }

    public static <T> List<T> getListaEntidades(Class<T> claseEntidad) throws HibernateException {
        GenericDAO dummy = new GenericDAO() {
        };

        List<T> listaResultado = null;

        try {
            dummy.iniciaOperacion();
            listaResultado = dummy.getSession().createQuery("FROM " + claseEntidad.getSimpleName()).list();
        } catch (HibernateException he) {
            dummy.manejaExcepcion(he);
        } finally {
            dummy.terminaOperacion();
        }

        return listaResultado;
    }
}
